<?php

declare(strict_types=1);

namespace PhpMyAdmin\Tests\Charsets;

use PhpMyAdmin\Charsets\Collation;
use PhpMyAdmin\Tests\AbstractTestCase;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\DataProvider;

#[CoversClass(Collation::class)]
class CollationTest extends AbstractTestCase
{
    public function testFromServer(): void
    {
        $serverCollation = [
            'Collation' => 'utf8_general_ci',
            'Charset' => 'utf8',
            'Id' => '33',
            'Default' => 'Yes',
            'Compiled' => 'Yes',
            'Sortlen' => '1',
            'Pad_attribute' => 'PAD SPACE',
        ];

        $collation = Collation::fromServer($serverCollation);

        $this->assertInstanceOf(Collation::class, $collation);
        $this->assertSame('utf8_general_ci', $collation->getName());
        $this->assertSame('Unicode, case-insensitive', $collation->getDescription());
        $this->assertSame('utf8', $collation->getCharset());
        $this->assertSame(33, $collation->getId());
        $this->assertTrue($collation->isDefault());
        $this->assertTrue($collation->isCompiled());
        $this->assertSame(1, $collation->getSortLength());
        $this->assertSame('PAD SPACE', $collation->getPadAttribute());
    }

    /**
     * Test case for buildDescription()
     *
     * @param string $collation   Collation for which description is reqd
     * @param string $description Expected Description
     */
    #[DataProvider('providerTestBuildDescription')]
    public function testBuildDescription(string $collation, string $description): void
    {
        $actual = Collation::fromServer(['Collation' => $collation]);
        $this->assertEquals($description, $actual->getDescription());
    }

    /** @return array<array{string, string}> */
    public static function providerTestBuildDescription(): array
    {
        return [
            ['binary', 'Binary'],
            ['foo_bulgarian_bar', 'Bulgarian'],
            ['gb2312_chinese', 'Simplified Chinese'],
            ['gbk_chinese', 'Simplified Chinese'],
            ['big5_chinese_ci', 'Traditional Chinese, case-insensitive'],
            ['big5_chinese', 'Traditional Chinese'],
            ['foo_ci_bar', 'Unknown, case-insensitive'],
            ['foo_croatian_bar', 'Croatian'],
            ['foo_czech_bar', 'Czech'],
            ['foo_danish_bar', 'Danish'],
            ['foo_english_bar', 'English'],
            ['foo_esperanto_bar', 'Esperanto'],
            ['foo_estonian_bar', 'Estonian'],
            ['foo_german1_bar', 'German (dictionary order)'],
            ['foo_german2_bar', 'German (phone book order)'],
            ['foo_hungarian_bar', 'Hungarian'],
            ['foo_icelandic_bar', 'Icelandic'],
            ['foo_japanese_bar', 'Japanese'],
            ['foo_latvian_bar', 'Latvian'],
            ['foo_lithuanian_bar', 'Lithuanian'],
            ['foo_korean_bar', 'Korean'],
            ['foo_persian_bar', 'Persian'],
            ['foo_polish_bar', 'Polish'],
            ['foo_roman_bar', 'West European'],
            ['foo_romanian_bar', 'Romanian'],
            ['foo_slovak_bar', 'Slovak'],
            ['foo_slovenian_bar', 'Slovenian'],
            ['foo_spanish_bar', 'Spanish (modern)'],
            ['foo_spanish2_bar', 'Spanish (traditional)'],
            ['foo_swedish_bar', 'Swedish'],
            ['foo_thai_bar', 'Thai'],
            ['foo_turkish_bar', 'Turkish'],
            ['foo_ukrainian_bar', 'Ukrainian'],
            ['foo_unicode_bar', 'Unicode'],
            ['ucs2', 'Unicode'],
            ['utf8', 'Unicode'],
            ['ascii', 'West European'],
            ['cp850', 'West European'],
            ['dec8', 'West European'],
            ['hp8', 'West European'],
            ['latin1', 'West European'],
            ['cp1250', 'Central European'],
            ['cp852', 'Central European'],
            ['latin2', 'Central European'],
            ['macce', 'Central European'],
            ['cp866', 'Russian'],
            ['koi8r', 'Russian'],
            ['gb2312', 'Simplified Chinese'],
            ['gbk', 'Simplified Chinese'],
            ['sjis', 'Japanese'],
            ['ujis', 'Japanese'],
            ['cp932', 'Japanese'],
            ['eucjpms', 'Japanese'],
            ['cp1257', 'Baltic'],
            ['latin7', 'Baltic'],
            ['armscii8', 'Armenian'],
            ['armscii', 'Armenian'],
            ['big5', 'Traditional Chinese'],
            ['cp1251', 'Cyrillic'],
            ['cp1256', 'Arabic'],
            ['euckr', 'Korean'],
            ['hebrew', 'Hebrew'],
            ['geostd8', 'Georgian'],
            ['greek', 'Greek'],
            ['keybcs2', 'Czech-Slovak'],
            ['koi8u', 'Ukrainian'],
            ['latin5', 'Turkish'],
            ['swe7', 'Swedish'],
            ['tis620', 'Thai'],
            ['foobar', 'Unknown'],
            ['foo_test_bar', 'Unknown'],
            ['foo_bin_bar', 'Unknown, binary'],
            ['utf8mb4_0900_ai_ci', 'Unicode (UCA 9.0.0), accent-insensitive, case-insensitive'],
            ['utf8mb4_unicode_520_ci', 'Unicode (UCA 5.2.0), case-insensitive'],
            ['utf8mb4_unicode_ci', 'Unicode (UCA 4.0.0), case-insensitive'],
            ['utf8mb4_tr_0900_ai_ci', 'Turkish (UCA 9.0.0), accent-insensitive, case-insensitive'],
            ['utf8mb4_turkish_ci', 'Turkish (UCA 4.0.0), case-insensitive'],
            ['utf32_thai_520_w2', 'Thai (UCA 5.2.0), multi-level'],
            ['utf8mb4_czech_ci', 'Czech (UCA 4.0.0), case-insensitive'],
            ['cp1250_czech_cs', 'Czech, case-sensitive'],
            ['latin1_general_ci', 'West European, case-insensitive'],
            ['utf8mb4_bin', 'Unicode (UCA 4.0.0), binary'],
            ['utf8mb4_croatian_mysql561_ci', 'Croatian (MySQL 5.6.1), case-insensitive'],
            ['ucs2_general_mysql500_ci', 'Unicode (MySQL 5.0.0), case-insensitive'],
            ['utf32_general_ci', 'Unicode, case-insensitive'],
            ['utf8mb4_es_trad_0900_ai_ci', 'Spanish (traditional) (UCA 9.0.0), accent-insensitive, case-insensitive'],
            ['utf8mb4_es_0900_ai_ci', 'Spanish (modern) (UCA 9.0.0), accent-insensitive, case-insensitive'],
            [
                'utf8mb4_de_pb_0900_ai_ci',
                'German (phone book order) (UCA 9.0.0), accent-insensitive, case-insensitive',
            ],
            ['utf8mb4_de_0900_ai_ci', 'German (dictionary order) (UCA 9.0.0), accent-insensitive, case-insensitive'],
            ['utf8_myanmar_ci', 'Burmese, case-insensitive'],
            ['utf8mb4_la_0900_as_cs', 'Classical Latin (UCA 9.0.0), accent-sensitive, case-sensitive'],
            ['utf8_sinhala_ci', 'Sinhalese, case-insensitive'],
            ['utf8_vietnamese_ci', 'Vietnamese, case-insensitive'],
            ['gb18030_chinese_ci', 'Chinese, case-insensitive'],
            ['utf8mb4_ja_0900_as_cs_ks', 'Japanese (UCA 9.0.0), accent-sensitive, case-sensitive, kana-sensitive'],
            ['utf8mb4_unicode_520_nopad_ci', 'Unicode (UCA 5.2.0), no-pad, case-insensitive'],
            ['utf8mb4_ru_0900_as_cs', 'Russian (UCA 9.0.0), accent-sensitive, case-sensitive'],
        ];
    }
}
